■ UART (RS232C)                                                    

■ 文字列の送受信(PC-PIC間) (PIC32MZ2048ECH100編)

 PIC側の ハード&ソフトは 文字列の送受信(PIC32MZ2048ECH100 Harmony)を参照願います

<試作品仕様>
 ・PCとターゲットボード間はUSB/RS232C変換ケーブルを使い PIC側からみてのインターフェースはRS232Cとする
 ・USB/RS232C変換ケーブルはUSBシリアルコンバーター REX-USB60F(ラトックシステム(株))とする
 ・RS232C通信は以下とする。
  フロー制御なし、9600bps、ストップビットx1、パリティなし

 ・パソコン側より 下記送信文字列に対し PIC側は対応する文字列を返信すること
  Japan ---> Tokyo
  America ---> Washinton
  U.K. ---> London
  France --> Paris
  その他 --> Pardon ?

 ・PC側は、受信文字列をテキストエディタに表示のこと
 ・PIC側は、 受信文字列 及び返信文字列をキャラクタ液晶のそれぞれ上段と下段に表示のこと

    プログラム
    

          

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Kanji_PC_PIC
{
    public partial class Form1 : Form
    {

        private int OpMode = 0; //0:文字列変換


        //文字を変換するクラスを宣言
        Encoding encSjis = Encoding.GetEncoding("shift-jis");
        Encoding encUni = Encoding.GetEncoding("unicode");

        
        public Form1()
        {
            InitializeComponent();
            serialPort1.PortName = "COM3";  //COM1 ポート使用
  //          serialPort1.PortName = "COM1";  //COM1 ポート使用
            serialPort1.BaudRate = 9600;   //9600bps
            serialPort1.Parity = System.IO.Ports.Parity.None;  //パリティなし
            serialPort1.DataBits = 8;  //データ長 8ビット
            serialPort1.StopBits = System.IO.Ports.StopBits.One;   //ストップビット 1
            serialPort1.ReadTimeout = 500;     //500mse 読み込みタイムアウト時間
            serialPort1.WriteTimeout = 500;    //500msec書き込みタイムアウト時間

            comboBox1.Items.Clear();
            comboBox1.Items.Add("Japan");
            comboBox1.Items.Add("America");
            comboBox1.Items.Add("U.K.");
            comboBox1.Items.Add("France");
            comboBox1.Items.Add("I am fine");
            comboBox1.SelectedIndex = 0;

        }

        delegate void ReceiveDelegate(string str);//デリゲート宣言

        private void SetText(string str)
        {
           
            richTextBox1.AppendText(str);

        }

     

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            byte[] byteRead = new byte[serialPort1.BytesToRead];  //受信文字

            serialPort1.Read(byteRead, 0, serialPort1.BytesToRead);//読み込み
            byte[] byteUni = Encoding.Convert(encSjis, encUni, byteRead);   //shift-jis からunicodeに変換する
            string strUni = encUni.GetString(byteUni);  //配列を文字列に変換

            ReceiveDelegate receiveDelegate = new ReceiveDelegate(SetText);
            this.Invoke(receiveDelegate, strUni);
        }

        private void button2_Click(object sender, EventArgs e)
        {
           
            richTextBox1.Clear();

        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == false) serialPort1.Open();//シリアルポートオープン

            string strSend = comboBox1.Text;
            if (!strSend.EndsWith("\r")) strSend += "\r";  //改行が無かったら \rを追加する
            Byte[] byteArry = encSjis.GetBytes(strSend); //'送信文字をShift-jisに変換してをByte配列に格納
            serialPort1.Write(byteArry, 0, byteArry.Length); //送信 

        }

   

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (OpMode == 1)
            {
                string strSend = "Data";
                if (!strSend.EndsWith("\r")) strSend += "\r";  //改行が無かったら \rを追加する
                Byte[] byteArry = encSjis.GetBytes(strSend); //'送信文字をShift-jisに変換してをByte配列に格納
                serialPort1.Write(byteArry, 0, byteArry.Length); //送信 
            }
            else
            {
                timer1.Enabled = false;     //タイマ停止
            }


        }

    }
}





   動作結果
     PC画面  液晶画面
上段: 受信文字列
下段: 返信文字列
コンボボックスで"Japan"を選択して送信後 "Tokyo"を受信した場合    
 A  
Japan
America
U.K.
France
I am fine
を 順次送信した
結果
   


 

■ 文字列の送受信(PC-PIC間) 
   PIC32MZ評価ボード版PIC: PIC32MZ2048EFH100
   (→VC#プロジェクトファイルダウンロード 

 PIC側の ハード&ソフトは (→ URL )を参照願います

<試作品仕様>
 ・PCとターゲットボード間はUSB/RS232C変換ケーブルを使い PIC側からみてのインターフェースはRS232Cとする
 ・USB/RS232C変換ケーブルはUSBシリアルコンバーター REX-USB60F(ラトックシステム(株))とする
 ・RS232C通信は以下とする。
  フロー制御なし、9600bps、ストップビットx1、パリティなし

 ・パソコン側より 下記送信文字列に対し PIC側は対応する文字列を返信すること
  Japan ---> Tokyo
  America ---> Washinton
  U.K. ---> London
  France --> Paris
  その他 --> Pardon ?

 ・PC側は、受信文字列をテキストエディタに表示のこと
 ・PIC側は、 受信文字列 及び返信文字列をキャラクタ液晶のそれぞれ上段と下段に表示のこと

  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports; //追加 シリアルポートコンポーネント用

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
//文字を変換するクラスを宣言
Encoding encSjis = Encoding.GetEncoding("shift-jis");
Encoding encUni = Encoding.GetEncoding("unicode");

delegate void ReceiveDelegate(string str);//デリゲート宣言

public Form1()
{

InitializeComponent();

SendDataCBox.Items.Clear();

SendDataCBox.Items.Add("Japan");
SendDataCBox.Items.Add("America");
SendDataCBox.Items.Add("U.K.");
SendDataCBox.Items.Add("France");
SendDataCBox.Items.Add("How are you ?");
SendDataCBox.SelectedIndex = 0;


string[] PortList = SerialPort.GetPortNames();
try
{

ComCBox.Items.Clear();

//シリアルポート名をコンボボックスにセット
foreach (string PortName in PortList)
{
ComCBox.Items.Add(PortName);
}
if (ComCBox.Items.Count > 0)
{
ComCBox.SelectedIndex = 0;
}

serialPort1.PortName = ComCBox.SelectedItem.ToString();

// serialPort1.PortName = "COM3"; //COM1 ポート使用
// serialPort1.PortName = "COM4"; //COM1 ポート使用
serialPort1.BaudRate = 9600; //9600bps
serialPort1.Parity = System.IO.Ports.Parity.None; //パリティなし
serialPort1.DataBits = 8; //データ長 8ビット
serialPort1.StopBits = System.IO.Ports.StopBits.One; //ストップビット 1
serialPort1.ReadTimeout = 500; //500mse 読み込みタイムアウト時間
serialPort1.WriteTimeout = 500; //500msec書き込みタイムアウト時間

serialPort1.Open();//シリアルポートオープン

}
catch (Exception ex)
{
DialogResult result = MessageBox.Show
(ex.Message + "\n" + "COMポートがひらけません。COMポートを接続してから本アプリケーションを起動してください。");
}


}

private void ComCBox_TextChanged(object sender, EventArgs e)
{
if (serialPort1.IsOpen == true)
{
serialPort1.Close();//シリアルポートクローズ

serialPort1.PortName = ComCBox.SelectedItem.ToString();
serialPort1.BaudRate = 9600; //9600bps
serialPort1.Parity = System.IO.Ports.Parity.None; //パリティなし
serialPort1.DataBits = 8; //データ長 8ビット
serialPort1.StopBits = System.IO.Ports.StopBits.One; //ストップビット 1
serialPort1.ReadTimeout = 500; //500mse 読み込みタイムアウト時間
serialPort1.WriteTimeout = 500; //500msec書き込みタイムアウト時間

serialPort1.Open();//シリアルポートオープン

}

}

private void SendDataBtn_Click(object sender, EventArgs e)
{
serialPort1.DiscardInBuffer(); //受信バッファのデータクリア

string strSend = SendDataCBox.Text;
if (!strSend.EndsWith("\r")) strSend += "\r"; //改行が無かったら \rを追加する
Byte[] byteArry = encSjis.GetBytes(strSend); //'送信文字をShift-jisに変換してをByte配列に格納
serialPort1.Write(byteArry, 0, byteArry.Length); //送信

}

private void SetText(string str)
{
richTextBox1.AppendText(str); //文字列追加
}


private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] byteRead = new byte[serialPort1.BytesToRead]; //受信文字

serialPort1.Read(byteRead, 0, serialPort1.BytesToRead);//読み込み
byte[] byteUni = Encoding.Convert(encSjis, encUni, byteRead); //shift-jis からunicodeに変換する
string strUni = encUni.GetString(byteUni); //配列を文字列に変換
ReceiveDelegate receiveDelegate = new ReceiveDelegate(SetText);
this.Invoke(receiveDelegate, strUni);

}

private void ClearBtn_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
}
}
}
   
<動作結果>
 (→ 動画: 1080pのHD動画を見ることができます。)